from time import sleep

from django.contrib.auth import authenticate, login, logout as out
from django.db import IntegrityError
from django.shortcuts import render, redirect
from django.views import View
from django.contrib.auth.models import User
from datetime import datetime

from user.forms import UserLRForm


class RegisterView(View):
    def get(self, request, **kwargs):
        # 创建空表单对象,并返回给前端渲染
        form = UserLRForm()
        return render(request, 'user/register.html', context={'form': form})

    def post(self, request, **kwargs):
        # print(request.POST)
        # 创建表单对象,里面有用户数据和密码数据
        form = UserLRForm(request.POST)
        # 校验数据，如果通过，返回True，否则返回False--会自己返回定义好的错误提示。
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            try:
                user = User(username=username, last_login=datetime.now())
                user.set_password(password)
                # 保存用户对象，这个时候才会通过数据库检查字段的唯一性
                user.save()
            except IntegrityError:
                message = '用户名已存在,请重新输入！'
            # 密码加密处理
            else:
                message = '注册成功！'
            return render(request, 'user/register.html', context={'message': message})


class LoginView(View):
    def get(self, request, **kwargs):
        # 创建表单对象,里面有用户数据和密码数据，都是自动检测过的。
        form = UserLRForm()
        # get请求的时候获取页面数据，需要把表单返回给到模版进行渲染
        return render(request, 'user/login.html', context={'form': form})

    def post(self, request, **kwargs):
        # print(request.POST)
        # 获取前端的post请求体里面传过来的数据
        # username = request.POST.get('username')
        # password = request.POST.get('password')
        # 创建表单对象 需要绑定用户在表单填写的数据，让表单对象帮我们完成校验
        form = UserLRForm(request.POST)
        # 用is_valid()方法校验数据的合法性，如果校验通过，返回True，否则返回False
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            # 校验数据-用auth.authenticate()方法
            # 1.1检验用户名和密码是否跟数据库里面的一致，如果有误则会自动返回对应的错误信息给前端
            user = authenticate(username=username, password=password)
            # 判断用户是否存在，如果存在则实现登录过程
            if user:
                # 校验通过 把登录的用户信息放到请求对象中
                # 使用内置的login来完成用户信息的认证
                login(request, user)
                # 获取地址栏中的next参数保存的地址值
                # GET请求 get通过键获取值
                next_url = request.GET.get('next')
                # 后面是否有next参数 发布页的地址路由保存到next参数里面
                if next_url:
                    return redirect(next_url)
                return redirect('index')
            # try:
            #     user = User.objects.get(username=username)
            # except User.DoesNotExist:
            #     message = '用户名不存在,请注册后再登录！'
            #     user = None
            #
            # else:
            #     # 校验用户的密码是否正确
            #     if user.check_password(password):
            #         # 账号密码正确 创建session信息，做会话维持
            #         # 将用户名信息存贮在session表里面 通过键添加值
            #         request.session['username'] = username
            #         # 可以自己添加过期时间 过期时间单位为秒，默认是14天过期
            #         # request.session.set_expiry(300)
            #         # 返回登录成功页面
            #         return redirect('index')
            #     else:
            #         message = '密码错误！'
            # # sleep(5)
        # 这步是在登录失败的时候返回登录页面，并且把错误信息返回给前端进行展示
        return render(request, 'user/login.html', context={'usernam': username})


def logout(request):
    # 清除所有会话数据，包含删除session表里面所有的数据和删除会话Cookie
    # request.session.flush()
    out(request)
    # 跳转到登录页面
    return redirect('login')
